package cn.group.hotel2.controller;

import cn.group.hotel2.pojo.vo.MessageListCountVO;
import cn.group.hotel2.pojo.vo.MessageListItemVO;
import cn.group.hotel2.pojo.vo.MessageStandardVO;
import cn.group.hotel2.pojo.vo.ReplyListItemVO;
import cn.group.hotel2.service.IMessageService;
import cn.group.hotel2.web.JsonResult;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.constraints.Range;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 处理留言相关请求的控制器
 * 
 * @author wcl
 * @version 0.0.1
 * @date 2022/11/26
 */
@Slf4j
@Valid
@RestController
@RequestMapping("/message")
@Api(tags = "04 留言管理模块")
public class MessageController {

    @Autowired
    private IMessageService messageService;

    public MessageController() {
        log.debug("创建控制器对象：MessageController");
    }

    @ApiOperation("根据id删除留言")
    @ApiOperationSupport(order = 200)
    @ApiImplicitParam(name="id",value = "留言id",required = true,dataType = "long")
    @PostMapping("/{id:[0-9]+}/delete")
    public JsonResult<Void> deleteById(@Range(min = 1,message = "删除留言失败,请填写有效的大于0的id") @PathVariable Long id) {
        log.debug("开始处理【根据id删除留言】的请求,参数:{}", id);
        messageService.deleteById(id);
        log.debug("删除留言成功!");
        return JsonResult.ok();
    }

    @ApiOperation("根据留言id修改其状态")
    @ApiOperationSupport(order = 310)
    @ApiImplicitParam(value = "留言id", name = "id", required = true, dataType = "long")
    @PostMapping("/{id:[0-9]+}/updateStatus")
    public JsonResult<Void> updateStatus(@Range(min = 1, message = "修改留言状态失败,请填写有效的大于0的id") @PathVariable Long id) {
        log.debug("开始处理【根据留言id修改其状态】的请求,参数:{}", id);
        messageService.updateStatusById(id);
        return JsonResult.ok();
    }

    @ApiOperation("根据id查询留言详情")
    @ApiOperationSupport(order = 405)
    @GetMapping("/{id:[0-9]+}/getStandardById")
    @ApiImplicitParam(name = "id", value = "留言id", required = true, dataType = "long")
    public JsonResult<MessageStandardVO> getStandardById(@Range(min = 1, message = "查询留言详情失败,请填写有效的大于0的id") @PathVariable Long id){
        log.debug("开始处理【根据id查询留言详情】请求,参数:{}", id);
        MessageStandardVO queryResult = messageService.getStandardById(id);
        return JsonResult.ok(queryResult);
    }

    @ApiOperation("查询留言列表")
    @ApiOperationSupport(order = 410)
    @GetMapping("")
    public JsonResult<List<MessageListItemVO>> list(){
        log.debug("开始处理【查询留言列表】请求,无参数");
        List<MessageListItemVO> list = messageService.list();
        return JsonResult.ok(list);
    }

    @ApiOperation("根据所选的页数来分页查询")
    @ApiOperationSupport(order = 411)
    @ApiImplicitParam(name="pageNum",value = "需要跳过的记录数",required = true,dataType = "long")
    @GetMapping("/listByPageNum")
    public JsonResult<List<MessageListItemVO>> listByPageNum(@Range(min = 1,message = "查询留言失败,请填写有效的大于0的页数")
                                                                         Long pageNum) {
        log.debug("开始处理【根据所选的页数来分页查询】的请求,参数:{}", pageNum);
        List<MessageListItemVO> list = messageService.listByPageNum(pageNum);
        return JsonResult.ok(list);
    }

    @ApiOperation("查询列表所有的数据以统计其数量")
    @ApiOperationSupport(order = 450)
    @GetMapping("/count")
    public JsonResult<List<MessageListCountVO>> listCount(){
        log.debug("开始处理【查询列表所有的数据以统计其数量】请求,无参数");
        List<MessageListCountVO> list = messageService.listCount();
        return JsonResult.ok(list);
    }

    @ApiOperation("查询回复列表")
    @ApiOperationSupport(order = 510)
    @GetMapping("/{id:[0-9]+}/reply-list")
    public JsonResult<List<ReplyListItemVO>> listById(@Range(min = 1,message = "查询留言失败,请填写有效的大于0的id") @PathVariable Long id){
        log.debug("开始处理【查询回复列表】请求,参数:{}", id);
        List<ReplyListItemVO> list = messageService.listById(id);
        return JsonResult.ok(list);
    }

    @ApiOperation("查询处于待回复状态下的留言列表")
    @ApiOperationSupport(order = 412)
    @GetMapping("/listWaitReply")
    public JsonResult<List<MessageListItemVO>> listWaitReply(){
        log.debug("开始处理【查询处于待回复状态下的留言列表】请求,无参数");
        List<MessageListItemVO> list = messageService.listWaitReply();
        return JsonResult.ok(list);
    }

    @ApiOperation("根据所选的页数来分页查询处于待回复状态下")
    @ApiOperationSupport(order = 413)
    @ApiImplicitParam(name="pageNum",value = "需要跳过的记录数",required = true,dataType = "long")
    @GetMapping("/listWaitReplyByPageNum")
    public JsonResult<List<MessageListItemVO>> listWaitReplyByPageNum(@Range(min = 1,message = "查询留言失败,请填写有效的大于0的页数")
                                                                     Long pageNum) {
        log.debug("开始处理【根据所选的页数来分页查询处于待回复状态下】的请求,参数:{}", pageNum);
        List<MessageListItemVO> list = messageService.listWaitReplyByPageNum(pageNum);
        return JsonResult.ok(list);
    }

    @ApiOperation("查询处于待回复状态下的列表所有的数据以统计其数量")
    @ApiOperationSupport(order = 451)
    @GetMapping("/listWaitReplyCount")
    public JsonResult<List<MessageListCountVO>> listWaitReplyCount(){
        log.debug("开始处理【查询处于待回复状态下的列表所有的数据以统计其数量】请求,无参数");
        List<MessageListCountVO> list = messageService.listWaitReplyCount();
        return JsonResult.ok(list);
    }

    @ApiOperation("查询处于已回复状态下的留言列表")
    @ApiOperationSupport(order = 414)
    @GetMapping("/listReply")
    public JsonResult<List<MessageListItemVO>> listReply(){
        log.debug("开始处理【查询处于已回复状态下的留言列表】请求,无参数");
        List<MessageListItemVO> list = messageService.listReply();
        return JsonResult.ok(list);
    }

    @ApiOperation("根据所选的页数来分页查询处于已回复状态下的")
    @ApiOperationSupport(order = 415)
    @ApiImplicitParam(name="pageNum",value = "需要跳过的记录数",required = true,dataType = "long")
    @GetMapping("/listReplyByPageNum")
    public JsonResult<List<MessageListItemVO>> listReplyByPageNum(@Range(min = 1,message = "查询留言失败,请填写有效的大于0的页数")
                                                                     Long pageNum) {
        log.debug("开始处理【根据所选的页数来分页查询处于已回复状态下的】的请求,参数:{}", pageNum);
        List<MessageListItemVO> list = messageService.listReplyByPageNum(pageNum);
        return JsonResult.ok(list);
    }

    @ApiOperation("查询处于已回复状态下的列表所有的数据以统计其数量")
    @ApiOperationSupport(order = 452)
    @GetMapping("/listReplyCount")
    public JsonResult<List<MessageListCountVO>> listReplyCount(){
        log.debug("开始处理【查询处于已回复状态下的列表所有的数据以统计其数量】请求,无参数");
        List<MessageListCountVO> list = messageService.listReplyCount();
        return JsonResult.ok(list);
    }
}
